,'''
2.实例分析
    (1) 好有管理系统中不仅需要保存好有名称,还需要保存分组以及分组中的好友,因此,我们需要明确以什么结构保存数据,根据功能描述,我们可以将数据以
['王五','张三','赵六',{'家人':['李四','刘备'},{'同事':['李龙','张飞']}]结构保存
    (2) 功能展示.功能展示用于向用户展示程序中包含的功能,以及接收用户输入的功能选项,实现用户人机交互的入口.
    (3) 添加好友.该功能逻辑相对简单,只需要将用户输入的好友名添加到好友列表中即可.
    (4) 获取所有好友.该功能用于获取好友列表中的所有数据,包括分组中的数据,便于后期对好友列表中的数据操作.
    (5) 获取所有分组及其分组好友,该功能用于获取好友列表中分组的名称和分组好友,不包括未分组的好友.
    (6) 获取分组名称.该功能仅仅用于获取所有的分组名称,用于后期哦安短用户输入的分组名是否合法.
    (7) 删除好友.此功能分为两种情况判断,一是:删除的还哦呦未在分组内,二是:删除的好友在分组内.如果删除的好友未在分组内,则直接在好友列表中删除:
如果删除的好友在分组内,那么需要先获取所有的分组和分组内的好友,根据用户输入的好友名称在对应的分组内进行删除
    (8) 备注好友.备注好友功能与删除好友逻辑类似,需要分为两种情况修改好友的备注名称,若修改备注的好友未在分组内,则直接获取好友名称并对其重新赋值;
若修改备注的好友在分组内,则需要找到该好友对应的分组并进行修改.
    (9) 展示好友.展示好友的功能分为展示所有好友和展示指定分组的好友,展示所有好友,直接调用已经定义好的获取所有好友方法即可,展示指定分组的好友,需要根据
用户输入的分组名称展示分组内的好友名称.
    (10) 好友分组.好友分组功能是将好友划分为不同的组,在使用好友分组功能是,会询问用户是否创建新的分组,如果用户选择创建新的分组,那么有用户输入新的分组
并创建,新的分组会以{'家人':['李四','刘备']}的结构添加到好友列表中;如果用户选择使用已存在的分组,那么需要由用户输入具体的分组名和具体的好友名,在将好友名
添加到分组前需要分别对分组名和好友名进行正确性校验,只有当分组名和好友名均存在时,才可以将好友名移动到指定的分组中.
    (11) 所有功能完成以后,需要将定义的类实例化并调用入口函数.
'''
'''
3. 代码实现:
'''
class Friend:
    def __init__(self):
        self.friend_li = []
    def welcom(self):
        print('**好友管理系统**')
        print('1:添加好友')
        print('2:删除好友')
        print('3:备注好友')
        print('4:展示好友')
        print('5:好友分组')
        print('6:退出')
        while True:
            option = input('请选择功能:\n')
            # 添加好友
            if option == '1':
                self.add_friend()
            # 删除好友
            elif option == '2':
                self.del_friend()
            # 备注好友
            elif option == '3':
                self.modify_friend()
            # 展示好友
            elif option == '4':
                self.show_friend()
            # 分组好友
            elif option == '5':
                self.group_friend()
            elif option == '6':
                break
    # 添加好友具体代码如下:
    def add_friend(self):
        add_friend = input('请输入要添加的好友:')
        self.friend_li.append(add_friend)
        print('好友添加成功')
    # 获取所有好友具体代码如下:
    def get_all_friends(self):
        new_li = []
        for friend_li_elem in self.friend_li:
            # 判断元素类型
            if type(friend_li_elem) == dict:
                # 遍历字典
                [new_li.append(dict_elem_name) for dict_elem in friend_li_elem.values() for dict_elem_name in dict_elem]
            else:
                new_li.append(friend_li_elem)
            return new_li
    # 获取所有分组及其好友具体代码如下:
    def get_all_groups(self):
        groups = []
        for friend_li_elem in self.friend_li:
            if type(friend_li_elem) == dict:
                groups.append(friend_li_elem)
        return groups
    # 获取所有分组名称具体代码如下:
    def get_all_groups_name(self):
        groups_name = []
        for dict_elem in self.get_all_groups():
            for j in dict_elem:
                '''在Python中，直接遍历字典(for key in my_dict)默认遍历的就是键
                   这比先获取键列表(list(my_dict.keys()))再遍历更高效'''
                groups_name.append(j)
        return groups_name
    # 删除好友具体代码如下
    def del_friend(self):
        if len(self.friend_li) != 0:
            del_name = input('请输入好友姓名:')
            # 删除的好友未分组
            if del_name in self.friend_li:
                self.friend_li.remove(del_name)
                print('删除成功')
            else:
                # 删除的好友在分组内
                if del_name in self.get_all_friends():
                    for group_data in self.get_all_groups():
                        for group_friend_li in group_data.values():
                            '''# 假设group_data是一个字典：group_data = {"分组1": ["朋友A", "朋友B"], "分组2": ["朋友C"]}
                               # 错误理解：以为.values()直接返回好友列表
                               # 实际：返回的是字典值的集合
                               print(group_data.values())
                               # 输出：dict_values([['朋友A', '朋友B'], ['朋友C']])'''
                            if del_name in group_friend_li:
                                group_friend_li.remove(del_name)
                                continue
                            print('删除成功')
        else:
            print('好有列表为空')
    # 备注好友具体代码如下:
    def modify_friend(self):
        friends = self.get_all_friends()
        if len(friends) == 0:
            print('好友列表为空')
        else:
            before_name = input('请示如要修改的好友姓名:')
            after_name = input('请输入修改后的好友姓名:')
            if before_name in self.friend_li:
                friend_index = self.friend_li.index(before_name)
                self.friend_li[friend_index] = after_name
                print('备注成功')
            elif before_name not in self.friend_li:
                for friend_li_elem in self.friend_li:
                    if type(friend_li_elem) == dict:
                        for dict_elem in friend_li_elem.values():
                            if before_name in dict_elem:
                                modify_index = dict_elem.index(before_name)
                                dict_elem[modify_index] = after_name
                print('备注成功')
    # 展示好友具体代码如下:
    def show_friend(self):
        print('1.展示所有好友')
        print('2.展示分组名称')
        option_show = input('请输入选项:')
        groups = self.get_all_groups()
        friends = self.get_all_friends()
        if option_show == '1':
            # 展示所有好友
            if len(friends) == 0:
                print('当前没有任何好友')
            else:
                print(friends)
        elif option_show == '2':
            if len(friends) == 0:
                print('当前没有任何好友')
            else:
                # 展示分组
                for dict_groups in groups:
                    for group_name in dict_groups:
                        print(group_name)
                is_show_group = input('是否展示组内好友:y/n\n')
                if is_show_group == 'y':
                    show_group_name = input('请输入查看的分组名称:')
                    for i in groups:
                        if show_group_name in i:
                            show_index = groups.index(i)
                            print(groups[show_index][show_group_name])
    # 分组好友具体代码如下:
    def group_friend(self):
        creat_group = input('是否创建新的分组:y/n\n')
        friends = self.get_all_friends()
        if creat_group == 'y':
            if len(friends) == 0:
                print('当前没有任何好友')
            else:
                # 请创建分组
                group_name = input('请输入分组名称:\n')
                group_name_li = list()
                # 展示当前好友
                print(friends)
                # 移动联系人到哪个组
                friend_name = input('请输入好友名称:\n')
                if friend_name in friends:
                    all_friend = []
                    for friend_li_elem in self.friend_li:
                        if type(friend_li_elem) == dict:
                            [all_friend.append(dict_friends) for dict_elem in friend_li_elem.values() for dict_friends in dict_elem]
                        else:
                            all_friend.append(friend_li_elem)
                if friend_name in all_friend:
                    group_name_li.append(friend_name)
                    self.friend_li.remove(friend_name)
                    # 构建字典(组名称:分组列表)
                    friend_dict = dict()
                    friend_dict[group_name] = group_name_li
                    self.friend_li.append(friend_dict)
                else:
                    print('请输入正确的好友名称:')
        elif creat_group == 'n':
            # 显示当前分组,将好友添加到指定的组
            current_groups = self.get_all_groups()
            print('当前分组')
            for current_group in current_groups:
                for group_name in current_group:
                    print(group_name)
            add_group = input('请选择添加的组:\n')
            # 判断用户输入的组名是否在当前以存在的分组中
            if add_group in self.get_all_groups_name():
                # 添加好友到指定的组
                add_name = input('请输入添加的好友名称:\n')
                # 判断用户输入的好友是否存在在好友列表中
                if add_name in self.friend_li:
                    # 判断用户输入的好友是否在其他组中
                    if add_name not in current_groups:
                        # 将好友添加到指定的组内
                        add_group_index = self.get_all_groups_name().index(add_group)
                        current_groups[add_group_index][add_group].append(add_name)
                else:
                    print('该好友已在其他分组中')
            else:
                print('请输入正确的组名')

# 启动程序
if __name__ == '__main__':
    friend = Friend()
    friend.welcom()


    


